home *** CD-ROM | disk | FTP | other *** search
/ Clickx 96 / Clickx 96.iso / software / tools / tool / xbmc-10.1.exe / addons / script.module.pil / lib / PIL / SgiImagePlugin.py < prev    next >
Encoding:
Python Source  |  2009-04-06  |  2.1 KB  |  93 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # SGI image file handling
  6. #
  7. # See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli.
  8. # <ftp://ftp.sgi.com/graphics/SGIIMAGESPEC>
  9. #
  10. # History:
  11. # 1995-09-10 fl   Created
  12. #
  13. # Copyright (c) 2008 by Karsten Hiddemann.
  14. # Copyright (c) 1997 by Secret Labs AB.
  15. # Copyright (c) 1995 by Fredrik Lundh.
  16. #
  17. # See the README file for information on usage and redistribution.
  18. #
  19.  
  20.  
  21. __version__ = "0.2"
  22.  
  23.  
  24. import Image, ImageFile
  25.  
  26.  
  27. def i16(c):
  28.     return ord(c[1]) + (ord(c[0])<<8)
  29.  
  30. def i32(c):
  31.     return ord(c[3]) + (ord(c[2])<<8) + (ord(c[1])<<16) + (ord(c[0])<<24)
  32.  
  33.  
  34. def _accept(prefix):
  35.     return i16(prefix) == 474
  36.  
  37. ##
  38. # Image plugin for SGI images.
  39.  
  40. class SgiImageFile(ImageFile.ImageFile):
  41.  
  42.     format = "SGI"
  43.     format_description = "SGI Image File Format"
  44.  
  45.     def _open(self):
  46.  
  47.         # HEAD
  48.         s = self.fp.read(512)
  49.         if i16(s) != 474:
  50.             raise SyntaxError("not an SGI image file")
  51.  
  52.         # relevant header entries
  53.         compression = ord(s[2])
  54.  
  55.         # bytes, dimension, zsize
  56.         layout = ord(s[3]), i16(s[4:]), i16(s[10:])
  57.  
  58.         # determine mode from bytes/zsize
  59.         if layout == (1, 2, 1) or layout == (1, 1, 1):
  60.             self.mode = "L"
  61.         elif layout == (1, 3, 3):
  62.             self.mode = "RGB"
  63.         elif layout == (1, 3, 4):
  64.             self.mode = "RGBA"
  65.         else:
  66.             raise SyntaxError("unsupported SGI image mode")
  67.  
  68.         # size
  69.         self.size = i16(s[6:]), i16(s[8:])
  70.  
  71.  
  72.         # decoder info
  73.         if compression == 0:
  74.             offset = 512
  75.             pagesize = self.size[0]*self.size[1]*layout[0]
  76.             self.tile = []
  77.             for layer in self.mode:
  78.                 self.tile.append(("raw", (0,0)+self.size, offset, (layer,0,-1)))
  79.                 offset = offset + pagesize
  80.         elif compression == 1:
  81.             self.tile = [("sgi_rle", (0,0)+self.size, 512, (self.mode, 0, -1))]
  82.  
  83. #
  84. # registry
  85.  
  86. Image.register_open("SGI", SgiImageFile, _accept)
  87.  
  88. Image.register_extension("SGI", ".bw")
  89. Image.register_extension("SGI", ".rgb")
  90. Image.register_extension("SGI", ".rgba")
  91.  
  92. Image.register_extension("SGI", ".sgi") # really?
  93.